home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / 8bit / cislib_b / st.act < prev    next >
Text File  |  1995-04-22  |  6KB  |  377 lines

  1.  
  2. MODULE ; ST.ACT 
  3.  
  4. ; Symbol table lister for ACTION! 
  5. ; compiler.  Lists local variables 
  6. ; per PROC/FUNC and globals at end 
  7. ; of compilation. 
  8.  
  9. ; copyright 1983 
  10. ; by Action Computer Services 
  11. ; All Rights Reserved 
  12.  
  13. ; version 1.0 
  14. ; last modified November 6, 1983 
  15.  
  16. ; user options: 
  17. ; change Open call in SPLEnd to get 
  18. ; listing to go to disk 
  19.  
  20.  
  21. DEFINE STRING = "CHAR ARRAY" 
  22. DEFINE JMP = "$4C" ; JMP addr16 
  23.  
  24. TYPE INSTR=[BYTE op CARD addr] 
  25. INSTR Segvec=$4C6, DCLvec=$4D4 
  26. INSTR SPLvec=$4DD 
  27.  
  28. TYPE ENTRY = 
  29. ; STRING name(?) 
  30.   BYTE vtype 
  31.   CARD adr 
  32.   BYTE numargs 
  33. ; BYTE ARRAY argTypes(8) 
  34.  
  35. BYTE oldDevice, curBank=$4C9 
  36. BYTE pf, Zop=$8A, tZop 
  37. CARD curproc=$8E 
  38. ENTRY POINTER e 
  39. CHAR ARRAY cmdLine(0)=$590 
  40. BYTE ARRAY bank(0)=$D500 
  41. BYTE ARRAY zpage(32), temps(16) 
  42.  
  43.  
  44. PROC PrintH(CARD v) 
  45.   PrintF("%H", v) 
  46. RETURN 
  47.  
  48.  
  49. PROC BaseType(BYTE et) 
  50.   et = et & $7 
  51.  
  52.   IF     et=1 THEN Print("CHAR") 
  53.   ELSEIF et=2 THEN Print("BYTE") 
  54.   ELSEIF et=3 THEN Print("INT") 
  55.   ELSEIF et=4 THEN Print("CARD") 
  56.   FI 
  57. RETURN 
  58.  
  59.  
  60. BYTE FUNC GetType(BYTE et) 
  61.   CHAR ch 
  62.   BYTE pfFlag, t, oldT 
  63.   ENTRY POINTER next 
  64.   STRING name 
  65.  
  66.   pfFlag = 0 
  67.  
  68.   IF et=39 THEN ; user type 
  69.     Print("TYPE=") 
  70.     name = e + 3 
  71.     next = name + name(0) + 1 
  72.     ch = '[ 
  73.     oldT = 0 
  74.     WHILE next.vtype<128 DO 
  75.       et = next.vtype & $7 
  76.       If et=0 THEN EXIT FI 
  77.       IF et=oldT THEN 
  78.         Print(", ") 
  79.       ELSE 
  80.         Put(ch) 
  81.         BaseType(et) 
  82.         Put(' ) 
  83.       FI 
  84.       oldT = et 
  85.       Print(name) 
  86.       ch = '  
  87.       name = next + 3 
  88.       next = name + name(0) + 1 
  89.     OD 
  90.     IF ch='[ THEN Put('[) FI 
  91.     Put(']) 
  92.     RETURN(0) 
  93.   FI 
  94.  
  95.   IF et=27 THEN ; DEFINE 
  96.     PrintF("DEFINE = ""%S""", e+3) 
  97.     RETURN(0) 
  98.   FI 
  99.  
  100. ; get basic type 
  101.   BaseType(et) 
  102.  
  103. ; only record vars less than 128 
  104.   IF et<128 THEN ; record 
  105.     IF (et&7)=0 THEN 
  106.       Print("RECORD") 
  107.       IF (et&8)=8 THEN 
  108.         Print(" POINTER") 
  109.       FI 
  110.     ELSE 
  111.       Print(" record field") 
  112.     FI 
  113.     RETURN(0) 
  114.   FI 
  115.                 
  116.   IF et&$10 THEN ; ARRAY 
  117.     Print(" ARRAY") 
  118.   ELSEIF et&$40 THEN ; PROC or FUNC 
  119.     pfFlag = 1 
  120.     IF (et&$F7)=$C0 THEN ; PROC 
  121.       Print("PROC") 
  122.     ELSE ; FUNC 
  123.       Print(" FUNC") 
  124.     FI 
  125.   FI 
  126. RETURN(pfFlag) 
  127.  
  128.  
  129. PROC PrintEntry(STRING n) 
  130.   DEFINE MAX = "15" 
  131.   BYTE i, et 
  132.   STRING name(MAX+1), t 
  133.   BYTE ARRAY argTypes 
  134.  
  135. ; get the name 
  136.   SetBlock(name+1, MAX, '.) 
  137.   SCopyS(name, n, 1, MAX) 
  138.   name(0) = MAX 
  139.  
  140. ; get address of entry info 
  141.   e = n + n(0) + 1 
  142.    
  143.   et = e.vtype 
  144.   IF et=$88 THEN RETURN FI ; undeclared 
  145.  
  146.   PrintF("%S ",name) 
  147.  
  148.   IF et=27 THEN ; DEFINE 
  149.     Print("     ") 
  150.   ELSE 
  151.     PrintH(e.adr) 
  152.   FI 
  153.   Put(' ) 
  154.  
  155.   IF GetType(et) THEN ; PROC or FUNC 
  156.     Put('() 
  157.     argTypes = e + 3 
  158.     t="" 
  159.     FOR i = 1 TO e.numargs DO 
  160.       Print(t) 
  161.       GetType(argTypes(i)%$80) 
  162.       t = ", " 
  163.     OD 
  164.     Put(')) 
  165.   FI 
  166.  
  167.   PutE() 
  168. RETURN 
  169.  
  170.  
  171. PROC DumpST(CARD POINTER base) 
  172.   CARD loc, i 
  173.   BYTE low=loc, high=loc+1, ibest 
  174.   BYTE ARRAY stLow, stHigh, flags(256) 
  175.   STRING best, worst(0)="|" 
  176.  
  177.   Zero(flags, 256) 
  178.   stHigh = base^ 
  179.   stLow = stHigh + 256 
  180.  
  181.   DO 
  182.     best = worst 
  183.     FOR i = 0 TO 255 DO 
  184.       high = stHigh(i) 
  185.       IF high#0 AND flags(i)=0 THEN 
  186.         low = stLow(i) 
  187.         IF SCompare(loc, best)<0 THEN 
  188.           best = loc 
  189.           ibest = i 
  190.         FI 
  191.       FI 
  192.     OD 
  193.    
  194.     IF best=worst THEN EXIT FI 
  195.  
  196.     flags(ibest) = 1 
  197.     PrintEntry(best) 
  198.   OD 
  199. RETURN 
  200.  
  201.  
  202. PROC Save() 
  203. ; save state of variables used by 
  204. ; both compiler and library routines 
  205.  
  206.   bank(0) = 0 ; init library routines 
  207.   tZop = Zop 
  208.   MoveBlock(zpage, $B0, $1B) ; to $CA 
  209.   MoveBlock(temps, $5F0, 16) 
  210.  
  211.   device = 5 
  212. RETURN 
  213.  
  214.  
  215. PROC Restore() 
  216. ; restore state of variables used by 
  217. ; both compiler and library routines 
  218.  
  219.   Zop = tZop 
  220.   MoveBlock($B0, zpage, $1B) ; to $CA 
  221.   MoveBlock($5F0, temps, 16) 
  222.  
  223. ; device = oldDevice 
  224.   bank(curBank) = 0 
  225. RETURN 
  226.  
  227.  
  228. PROC SegEnd() 
  229.   Save() 
  230.   IF pf THEN ; print locals 
  231.     PrintF("%ELocal declarations for %S:%E", curproc) 
  232.     DumpST($B3) 
  233.   ELSE 
  234.     pf = 1 
  235.   FI 
  236.   Restore() 
  237. RETURN 
  238.  
  239.  
  240. BYTE FUNC DclEnd() 
  241.   BYTE token=$C2 
  242.   CARD addr1, addr2 
  243.  
  244.   DEFINE PLA = "$68", 
  245.          STA = "$8D", 
  246.          LDA = "$AD", 
  247.          PHA = "$48" 
  248.  
  249. ; find out where we came from 
  250.   [    
  251.     PLA 
  252.     STA addr1 
  253.     PLA 
  254.     STA addr1+1 
  255.     PLA 
  256.     STA addr2 
  257.     PLA 
  258.     STA addr2+1 
  259.     PHA 
  260.     LDA addr2 
  261.     PHA 
  262.     LDA addr1+1 
  263.     PHA 
  264.     LDA addr1 
  265.     PHA 
  266.   ] 
  267.   IF addr2<$B000 THEN ; new MODULE 
  268.     SegEnd() 
  269.     pf = 0 
  270.   FI 
  271. RETURN(token) 
  272.  
  273.  
  274. PROC SPL() ; dummy proc for call below 
  275.  
  276.  
  277. PROC SPLEnd() 
  278.   BYTE nxttoken=$D3 
  279.   CARD codeBase=$491, codeSize=$493 
  280.   CARD nxtaddr=$C9 
  281.   STRING inbuf(0)=$5C8, name 
  282.  
  283.   DEFINE PLA = "$68", 
  284.          STA = "$8D" 
  285.  
  286. ; oldDevice = device 
  287.   Save() 
  288.  
  289.   Close(5)  Open(5, "P:", 8) 
  290.  
  291.   IF nxttoken=30 THEN ; command line 
  292.     name = nxtaddr 
  293.   ELSE ; editor buffer 
  294.     name = inbuf 
  295.   FI 
  296.   PrintF("%E%ESymbol Table for %S%E%E", name) 
  297.  
  298.   pf = 0 ; no proc decl yet 
  299.  
  300. ; JSR for return so that we come 
  301. ; back here after compilation 
  302.   [    
  303.     PLA 
  304.     STA SPL+1 
  305.     PLA 
  306.     STA SPL+2 
  307.   ] 
  308.   SPL = SPL + 1 ; get right address 
  309.   Restore() 
  310.   SPL() 
  311.  
  312.   Save() 
  313.  
  314.   IF pf THEN ; print locals 
  315.     PrintF("%ELocal declarations for %S:%E", curproc) 
  316.     DumpST($B3) 
  317.   FI 
  318.  
  319.   PrintF("%E%EGlobal declarations:%E%E") 
  320.   DumpST($B1) 
  321.  
  322.   PrintF("%E%ECode base = %H, code size = %U%E", 
  323.          codeBase, codeSize) 
  324.  
  325.   Close(5) 
  326.   Restore() 
  327. RETURN 
  328.  
  329.  
  330. ; only code generated before Init is 
  331. ; allocated space.  Init will be 
  332. ; garbage collected (well kind of). 
  333.  
  334. PROC Init() 
  335.   CARD codeBlock, bsize, csize, nBlock 
  336.   CARD POINTER cur, next 
  337.   CARD ARRAY codeBase=$491 
  338.  
  339. ; link in our routines 
  340.   Segvec.op = JMP 
  341.   Segvec.addr = SegEnd 
  342.   Dclvec.op = JMP 
  343.   Dclvec.addr = DclEnd 
  344.   SPLvec.op = JMP 
  345.   SPLvec.addr = SPLEnd 
  346.  
  347. ; allocate our routine so it won't 
  348. ; go away. 
  349.   codeBlock = codeBase^ - 4 
  350.   next = $80 ; AFbase 
  351.   DO 
  352.     cur = next 
  353.     next = next^ 
  354.   UNTIL next=0 OR next=codeBlock OD 
  355.  
  356.   IF next=0 THEN 
  357.     PutE()   Put($FD) 
  358.     PrintE("I can't allocate space for your code") 
  359.     PrintE("You better Boot and try again!") 
  360.     RETURN 
  361.   FI 
  362.  
  363. ; assume we can split block 
  364.   csize = @codeBlock-codeBlock 
  365.   nBlock = next^ 
  366.   bsize = next(1) - csize 
  367.   next = @codeBlock 
  368.   cur^ = next 
  369.   next^ = nBlock 
  370.   next(1) = bsize 
  371.   codeBase^ = @codeBlock 
  372. RETURN 
  373.  
  374.